package com.irisking.ikaisdk.netCommond;

import com.irisking.ikaisdk.dataStruct.CommandResp;
import com.irisking.ikaisdk.netCommond.entity.*;

import java.util.Date;

public interface ICommand {
    /**
     * 操作设备开启门禁
     * @param sn  字符串	必须	 目标设备的设备序列号
     * @param cardID 字符串 必须   门禁卡号
     * @return
     */
    CommandResp OpenDoor(String sn, String cardID);

    /**
     * 获取与当前SDK正保持连接的设备的列表,连接数量为0时不返回列表。
     * @return
     */
    DeviceListResp GetDeviceList();

    /**
     * 获取设备的连接状态，判断当前client实例是否正和设备连接中，是则返回True，否则返回False。
     * @param sn 字符串	必须	 目标设备的设备序列号
     * @return
     */
    boolean IsConnected(String sn);

    /**
     * 获取设备中的人员列表
     * @param sn 字符串    必须   目标设备的设备序列号
     * @param offset 数值	可选	 默认为0,以注册时间排序
     * @param pageSize 数值	可选 默认为100,最多1000
     * @param startTime 日期	可选	 筛选条件的开始时间，按人员新增时间进行人员筛选
     * @param endTime 日期	可选  筛选条件的结束时间，按人员新增时间进行人员筛选
     * @param includeFeature 布尔 可选 默认为False
     * @return
     */
    PersonListResp GetPersonList(String sn, int offset , int pageSize , Date startTime , Date endTime , boolean includeFeature );


    /**
     * 获取设备中的人员信息。可根据人员编号获取指定人员的所有信息，包括基础信息、卡号、虹膜特征、虹膜图片、人脸图片
     * @param sn 字符串	必须 目标设备的设备序列号
     * @param personId 字符串  必须  需获取信息的人员ID
     * @param includeFeature 布尔  可选  默认为False
     * @param includeIrisImage 布尔  可选  默认为False
     * @param includeFaceImage 布尔  可选  默认为False
     * @return
     */
    PersonResp GetPerson(String sn, String personId, boolean includeFeature , boolean includeIrisImage , boolean includeFaceImage );

    /**
     * 在设备上新增人员信息, 可在新增时指定新增人员的基础信息、卡号、虹膜特征、虹膜图片、人脸图片（不产生虹膜注册事件）
     * @param sn 字符串	必须  目标设备的设备序列
     * @param personInfo 人员对象  必须  人员信息对象
     * @param irisFeatures 特征对象数组  可选   采集到的虹膜特征
     * @param irisPics 虹膜图片对象数组   可选  采集到的虹膜图片
     * @param faceInfo 人脸特征	 可选
     * @param faceImage 人脸图片
     * @return
     */
    CommandResp AddPerson(String sn, PersonInfo personInfo, IrisFeature[] irisFeatures , IrisPic[] irisPics , FaceInfo[] faceInfo , String faceImage );


    /**
     * 批量新增人员信息, 可在新增时指定新增人员的基础信息、卡号、虹膜特征、虹膜图片、人脸图片（不产生虹膜注册事件）
     * @param sn 字符串	必须  目标设备的设备序列号
     * @param personSuite 人员对象  必须  人员信息对象
     * @return
     */
    RegisterResp BatchAddPerson(String sn, PersonSuite[] personSuite);

    /**
     * 编辑设备中已存在的人员信息。可在编辑时指定新的人员基础信息、卡号、虹膜特征、虹膜图片、人脸图片
     * @param sn 字符串	必须	 目标设备的设备序列号
     * @param personId 字符串  必须  需修改信息的人员ID
     * @param personInfo 人员对象  可选  新的人员信息对象
     * @param deleteFeatureIDs 整数数组  可选  标记被删除的特征ID
     * @param irisFeatures 特征对象数组  可选   采集到的虹膜特征
     * @param irisPics 虹膜图片对象数组   可选  采集到的虹膜图片
     * @param faceInfo 图片	 可选  人员对应的人脸图片
     * @param faceImage
     * @return
     */
    CommandResp UpdatePerson(String sn, String personId, PersonInfo personInfo , String[] deleteFeatureIDs , IrisFeature[] irisFeatures , IrisPic[] irisPics , FaceInfo[] faceInfo , String faceImage );

    /**
     * 删除设备中的指定人员（不产生人员删除事件）
     * @param sn 字符串  必须  目标设备的设备序列号
     * @param personIds 字符串数组  可选  多个人员ID，支持一次删除多个人员
     * @return
     */
    DeletePersonResp DeletePerson(String sn, String[] personIds );

    /**
     * 获取设备相关信息
     * @param sn 字符串  必须  目标设备的设备序列号
     * @return
     */
    DeviceInfoResp GetDeviceInfo(String sn);

    /**
     * 设置设备时间
     * @param sn 字符串  必须  目标设备的设备序列号
     * @param time 日期时间	必须	  待设置的日期和时间
     * @return
     */
    CommandResp SetDeviceTime(String sn, Date time);

    /**
     * 向设备发送关机指令
     * @param sn >字符串  必须  目标设备的设备序列号
     * @return
     */
    CommandResp PowerOff(String sn);

    /**
     * 向设备发送重启指令
     * @param sn 字符串  必须  目标设备的设备序列号
     * @return
     */
    CommandResp Reboot(String sn);

    /**
     * 向设备发送重置为初始化状态的指令。服务IP不变，同时设置设备时间、清除事件消息、清除人员信息、清除日志、设置设备状态（可以新增、修改、发消息）、服务ID
     * @param sn 字符串  必须  目标设备的设备序列号
     * @param serverId 字符串  必须  服务器端产生的的服务ID
     * @param time 日期时间  可选   待设置的日期和时间，不设置时则不变更时间
     * @param deviceState 状态对象  可选  设置设备的控制状态
     * @return
     */
    CommandResp ReSetDevice(String sn, String serverId, Date time, DeviceState deviceState);

    /**
     * 向设备发送设置状态的指令
     * @param sn 字符串  必须  目标设备的设备序列号
     * @param deviceState 状态对象  必须  设置设备的控制状态
     * @return
     */
    CommandResp SetDeviceState(String sn, DeviceState deviceState);

    /**
     * 向设备发送获取状态的指令
     * @param sn 字符串  必须  目标设备的设备序列号
     * @return
     */
    DeviceStateResp GetDeviceState(String sn);

    /**
     * 清除设备上还未发送的事件消息队列
     * @param sn 字符串  必须  目标设备的设备序列号
     * @return
     */
    CommandResp VacuumEvent(String sn);

    /**
     * 清除人员、虹膜、人脸等信息
     * @param sn 字符串  必须  目标设备的设备序列号
     * @return
     */
    CommandResp VacuumSerivce(String sn);

    /**
     * 清除所有日志信息
     * @param sn 字符串  必须  目标设备的设备序列号
     * @return
     */
    CommandResp VacuumSerivceLog(String sn);

    /**
     * 从指定的编号开始获取设备日志，包括所有设备操作日志，按操作类型分类。日志保存的最大条数为100万条，超出了后自动清除最早的单条日志后，再插入新日志。
     * @param sn 字符串  必须  目标设备的设备序列号
     * @param offset 数值	可选	    获取的开始编号，默认为0
     * @param pageSize 数值	可选	    默认值1000条，最大10000条
     * @param startTime 数值	可选	   日志类型，详见日志记录规则表
     * @param endTime 日期   可选	    筛选的开始时间，按日志的记录时间进行筛选
     * @param type 日期   可选      筛选的结束时间，按日志的记录时间进行筛选
     * @return
     */
    LogsResp GetLogs(String sn, int offset, int pageSize, Date startTime , Date endTime , int type);

    /**
     * 配置设备的IP地址，包括IP地址配置方式，IP地址，子网掩码，网关，服务器IP地址
     * @param sn 字符串  必须  目标设备的设备序列号
     * @param configurationMode 整型  必须 1、自动获取IP 2、手动配置IP
     * @param ipAddress 字符串  可选  待设置的IP地址
     * @param subnetMask 字符串  可选  待设置的子网掩码
     * @param gateway 字符串  可选  待设置的网关地址
     * @param serverIPAddress 字符串  可选  待设置的服务器IP地址
     * @return
     */
    CommandResp ConfigIpAddress(String sn, int configurationMode, String ipAddress , String subnetMask , String gateway , String serverIPAddress );

    /// <summary>
    ///
    /// </summary>
    /// <param name="sn"></param>
    /// <returns></returns>

    /**
     * 获取门禁状态，未实现
     * @param sn 字符串  必须  目标设备的设备序列号
     * @return
     */
    DeviceDoorResp GetDoorState(String sn);

    /// <summary>
    ///
    /// </summary>
    /// <param name="sn"></param>
    /// <param name="version"></param>
    /// <param name="upgrade_url"></param>
    /// <returns></returns>

    /**
     * 升级固件
     * @param sn  字符串  必须  目标设备的设备序列号
     * @param version 版本
     * @param upgrade_url 固件地址
     * @return
     */
    CommandResp UpgradeFirmware(String sn, String version, String upgrade_url);

    /**
     * 下发云识别结果
     * @param sn 设备序列号
     * @param cloud_send_sn
     * @param recog_result 识别结果1：识别成功 2：识别失败 3：人员被锁定 4：人员无权限 5：特殊时段无法通过
     * @param device_identify_type 设备认证类型1：单虹膜2：单人脸3：虹膜加人脸
     * @param identify_type 验证方式 当设备认证类型device_identify_type为1时——1：虹膜或卡2：虹膜和卡3：只有虹膜4：只有卡。当设备认证类型为2时——1：人脸或卡2：人脸和卡3：只有人脸4：只有卡。当设备认证类型为3时——1：生物特征或卡2：生物特征和卡3：只有生物特征4：只有卡。其中，生物特征见bio_type字段的设置
     * @param recogTime 识别时间
     * @param personInfo 识别的人员信息
     * @return
     */
    CommandResp SendCloudIdentifyResult(String sn, String cloud_send_sn, int recog_result, int device_identify_type, int identify_type, Date recogTime, PersonSuite[] personInfo);

    /**
     * 下发密码验证结果
     * @param sn
     * @param cloud_send_sn >云数据发送序号。之前服务端从设备收到的“上传密码”请求中cloud_send_sn字段中的的值。此“验证密码结果”，就是验证“上传密码”请求中密码的结果
     * @param password_result 识别结果1：成功 2：失败 3：人员被锁定 4：人员无权限 5：特殊时段无法通过
     * @param surplus_result 密码输入剩余次数
     * @param recogTime 识别时间
     * @param personInfo 人员信息，格式说明请见PersonInfo，其中person_id, user_id和name为必填内容
     * @return
     */
    CommandResp SendPasswordVerifyResult(String sn, String cloud_send_sn, int password_result,int surplus_result, Date recogTime, PersonInfo personInfo);

    /**
     * 发送虹膜采集指令
     * @param sn 目标设备序列号
     * @param featuretype 虹膜采集类型
     * @param collectid 采集流水号
     * @return
     */
    CommandResp StartCollectFeature(String sn, int featuretype, String collectid );

    /**
     * 获取门禁权限
     * 获取门禁权限组、多人开门权限和多组开门权限
     * @param sn  目标设备序列号
     * @param persons_verify_flag 验证方式
     * @return
     */
    PermissionResp GetPermission(String sn, int persons_verify_flag );

    /**
     * 获取门禁权限
     * 获取门禁权限组、多人开门权限和多组开门权限
     * @param sn 目标设备序列号
     * @param count
     * @param permission_list
     * @return
     */
    CommandResp AddPermission(String sn, int count, Permission[] permission_list);

    /**
     * 修改门禁权限组、多人开门权限和多组开门权限
     * @param sn 目标设备序列号
     * @param count 数量
     * @param permission_list 权限列表
     * @return
     */
    CommandResp UpdatePermission(String sn, int count, Permission[] permission_list);

    /**
     * 修改门禁权限组、多人开门权限和多组开门权限
     * @param sn 目标设备序列号
     * @param count 数量
     * @param permission_ids 权限ID
     * @return
     */
    CommandResp DeletePermission(String sn, int count, String[] permission_ids);

    /**
     * 获取设备参数
     * @param sn 目标设备序列号
     * @param param 具体参数key
     * @return
     */
    DeviceParamResp GetDeviceParam(String sn, String[] param);

    /**
     * 设置设备参数
     * @param sn 目标设备序列号
     * @param param 设备参数
     * @return
     */
    CommandResp SetDeviceParam(String sn, DeviceParam[] param);

}
